﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Medicamento
    {
        public long MedicamentoId { get; set; }
        public short TipoAplicacao { get; set; }
        public string NumeroLote { get; set; }
        public decimal Valor { get; set; }
        public int FornecedorId { get; set; }
        private bool isGeneric;
        private bool _isGeneric;
        public bool IsGeneric { get { return this.isGeneric; } set { this.isGeneric = value; this._isGeneric = true; } }
        public int TipoMedicamentoId { get; set; }
        public TipoMedicamento Tipo { get; set; }
        public int Quantidade { get; set; }
        public DateTime DataEntrega { get; set; }
        public DateTime DataValidade { get; set; }
        public DateTime DataCadastro { get; private set; }
        public bool IsNew { get { return this.MedicamentoId == 0; } }
        public RzCorportativo.DataAccess.Medicamento model;

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.IsNew)
                {
                    this.DataCadastro = DateTime.Now;
                    this.model = this.Insert(entity);
                }
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.MedicamentoId = this.model.MedicamentoId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Medicamento Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToMedicamento(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Medicamento Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Medicamento CreateModel(RZCorporativoEntities entity)
        {
            var medicamento = new RzCorportativo.DataAccess.Medicamento();
            if (!this.IsNew)
            {
                medicamento = entity.Medicamento.Where(w => w.MedicamentoId == this.MedicamentoId).FirstOrDefault();
                if (medicamento == null)
                    throw new Exception("Código inválido");
            }

            medicamento.FornecedorId = this.FornecedorId;
            medicamento.MedicamentoId = this.MedicamentoId;
            medicamento.TipoAplicacao = this.TipoAplicacao;
            medicamento.TipoMedicamento = this.TipoMedicamentoId;
            medicamento.NumeroLote = this.NumeroLote;
            medicamento.DataCadastro = this.DataCadastro;
            medicamento.DataEntrega = this.DataEntrega;
            medicamento.DataValidade = this.DataValidade;
            medicamento.Quantidade = this.Quantidade;
            medicamento.Valor = this.Valor;
            medicamento.IsGeneric = this.IsGeneric;
            return medicamento;
        }

        internal Medicamento CreateMedicamento(RzCorportativo.DataAccess.Medicamento item)
        {
            Medicamento medicamento = new Medicamento();
            medicamento.FornecedorId = item.FornecedorId;
            medicamento.MedicamentoId = item.MedicamentoId;
            medicamento.NumeroLote = item.NumeroLote;
            medicamento.DataCadastro = item.DataCadastro;
            medicamento.DataEntrega = item.DataEntrega;
            medicamento.DataValidade = item.DataValidade;
            medicamento.Quantidade = item.Quantidade;
            medicamento.Valor = item.Valor;
            medicamento.IsGeneric = item.IsGeneric;
            this.TipoAplicacao = item.TipoAplicacao;
            return medicamento;
        }

        public static List<Lib.Medicamento> Listar(Lib.Medicamento medicamento)
        {
            if (medicamento == null)
                medicamento = new Medicamento();
            List<Lib.Medicamento> medicamentos = new List<Lib.Medicamento>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            bool validaDataValidade = medicamento.DataValidade.Date > DateTime.MinValue;
            bool validaDataEntrega = medicamento.DataEntrega.Date > DateTime.MinValue;
            bool validaDataCadastro = medicamento.DataCadastro.Date > DateTime.MinValue;
            medicamentos = db.Medicamento.Where(w =>
                    ((medicamento.FornecedorId == 0) || (medicamento.FornecedorId == w.FornecedorId)) &&
                    ((medicamento.MedicamentoId == 0) || (medicamento.MedicamentoId == w.MedicamentoId)) &&
                    ((medicamento.TipoAplicacao == 0) || (medicamento.TipoAplicacao == w.TipoAplicacao)) &&
                    ((medicamento.NumeroLote == null || medicamento.NumeroLote == "") || (w.NumeroLote.Contains(medicamento.NumeroLote))) &&
                    (!validaDataValidade || (medicamento.DataValidade.Date == w.DataValidade.Date)) &&
                    (!validaDataEntrega || (medicamento.DataEntrega.Date == w.DataEntrega.Date)) &&
                    (!validaDataCadastro || (medicamento.DataCadastro.Date == w.DataCadastro.Date)) &&
                    ((!medicamento._isGeneric) || (medicamento.IsGeneric == w.IsGeneric) )
                ).ToList().Select(s => medicamento.CreateMedicamento(s)).ToList();
            return medicamentos;
        }

    }
}
